package com.irdstudio.efp.batch.service.impl.bd;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.irdstudio.basic.framework.core.base.FrameworkService;
import com.irdstudio.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.irdstudio.basic.framework.core.util.DateTool;
import com.irdstudio.efp.batch.service.facade.bd.BdFeeRateBatchService;
import com.irdstudio.efp.batch.service.util.DueDataUtil;
import com.irdstudio.efp.ctr.service.facade.CtrLoanContService;
import com.irdstudio.efp.loan.service.facade.AccLoanService;
import com.irdstudio.efp.loan.service.facade.AccoutErroTempService;
import com.irdstudio.efp.loan.service.facade.BdFeeRateService;
import com.irdstudio.efp.loan.service.facade.BdFeeRateTempService;
import com.irdstudio.efp.loan.service.facade.BdIntFeeDetailTempService;
import com.irdstudio.efp.loan.service.vo.AccLoanVO;
import com.irdstudio.efp.loan.service.vo.AccoutErroTempVO;
import com.irdstudio.efp.loan.service.vo.BdFeeRateTempVO;
import com.irdstudio.efp.loan.service.vo.BdFeeRateVO;
import com.irdstudio.efp.nls.service.facade.BdLoanpayService;
import com.irdstudio.efp.nls.service.facade.NlsApplyInfoService;

/**
 * 
 * 根据百度同步过来的百度费率文件信息临时表数据修改费率表
 * 
 * @author ludayong
 * @since 2019年3月7日 下午3:18:50
 * @version 1.0
 */
@Service("bdFeeRateBatchService")
public class BdFeeRateBatchServiceImpl implements BdFeeRateBatchService, FrameworkService {

	private static Logger logger = LoggerFactory.getLogger(BdFeeRateBatchServiceImpl.class);

	@Autowired
	@Qualifier("bdFeeRateTempService")
	private BdFeeRateTempService bdFeeRateTempService;// 费率临时信息

	@Autowired
	@Qualifier("bdFeeRateService")
	private BdFeeRateService bdFeeRateService;// 费率信息

	@Autowired
	@Qualifier("accLoanService")
	private AccLoanService accLoanService;// 借据信息

	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 错误信息

	@Autowired
	@Qualifier("bdIntFeeDetailTempService")
	private BdIntFeeDetailTempService bdIntFeeDetailTempService;// 费率临时信息

	// @Autowired
	// @Qualifier("bdDnDetailTempService")
	// private BdDnDetailTempService bdDnDetailTempService;// 放款明细临时信息
	@Autowired
	@Qualifier("bdLoanpayService")
	private BdLoanpayService bdLoanpayService;// 百度放款通知记录信息

	@Autowired
	@Qualifier("nlsApplyInfoService")
	private NlsApplyInfoService nlsApplyInfoService;// 网贷申请信息

	@Autowired
	@Qualifier("ctrLoanContService")
	private CtrLoanContService ctrLoanContService;// 贷款合同

	/**
	 * 
	 * 根据百度同步过来的百度费率文件信息临时表数据修改费率表 <br>
	 * 0.1:ludayong:2019年3月7日 下午3:17:41:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月7日 下午3:17:41
	 * @date 2019年3月7日 下午3:17:41
	 * @version 0.1
	 */
	@SuppressWarnings("unchecked")
	@Override
	public boolean batchUpdateFeeRate() throws Exception {
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步百度费率临时数据到费率表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
		// 可以配置参数
		Integer pageSize = 1000;
		try {
			// 单位转换
			final int oneHundred100 = 100;
			// 单位转换
			final int oneHundred10000 = 10000;
			// 需要新增或者修改的百度费率信息
			List<BdFeeRateTempVO> list = null;
			// 分页信息
			BdFeeRateTempVO pageInfo = new BdFeeRateTempVO();
			// 新增或者修改的百度费率信息数量
			int num = 0;
			// 页数
			int page = 1;
			// pageSize初始化
			if (pageSize > 0) {
				pageInfo.setSize(pageSize);
			} else {
				pageInfo.setSize(1000);
			}
			// 判断循环次数
			int size = bdFeeRateTempService.queryCount();
			String size_msg = "【费率临时表】数据量：" + size;
			logger.info(size_msg, "message{}");
			int loopCount = (size / pageInfo.getSize()) + 1;
			// 放款信息
			// BdDnDetailTempVO inBdDnDetailTempVO = new BdDnDetailTempVO();
			// 百度放款通知记录信息
			// BdLoanpayVO inBdLoanpayVO = new BdLoanpayVO();
			// 网贷申请基本信息
			// NlsApplyInfoVO inNlsApplyInfoVO = new NlsApplyInfoVO();
			// 借据信息
			AccLoanVO inAccLoanVO = new AccLoanVO();
			// 借据号
			String bdLoanId = null;
			for (int i = 0; i < loopCount; i++) {
				String page_msg = "【费率临时表】当前页数：" + pageInfo.getPage() + "，分页大小：" + pageInfo.getSize();
				logger.info(page_msg, "message{}");
				// 分页查询【费率表】数据
				List<BdFeeRateTempVO> tempList = bdFeeRateTempService.queryByPage(pageInfo);
				list = new ArrayList<BdFeeRateTempVO>();
				if (Objects.nonNull(tempList) && !tempList.isEmpty()) {
					for (BdFeeRateTempVO bdFeeRateTempVO : tempList) {
						bdLoanId = bdFeeRateTempVO.getLoanId();
						// 放款明细入参
						// inBdDnDetailTempVO.setLoanId(bdLoanId);
						// 查询的放款信息
						// BdDnDetailTempVO queryBdDnDetailTempVO =
						// bdDnDetailTempService.queryByPk(inBdDnDetailTempVO);
						// 百度放款通知记录信息
						// inBdLoanpayVO.setLoanId(bdLoanId);
						// 查询百度放款通知记录信息
						// BdLoanpayVO queryBdLoanpayVO = bdLoanpayService.queryByPk(inBdLoanpayVO);
						// String orderId = "";
						// if (Objects.nonNull(queryBdLoanpayVO)) {
						// // 订单号
						// orderId = queryBdLoanpayVO.getOrderId();
						// } else {
						// String tableName = "bd_loanpay";
						// String errorMsg = "未查询到费率信息关联的百度放款通知记录信息，借据号：" + bdLoanId;
						// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
						// errorMsg);
						// logger.error(errorMsg);
						// }
						// 网贷用信申请流水号
						// String applySeq = "";
						// 订单号非空
						// if (!StringUtil.isNullorBank(orderId)) {
						// // 订单号
						// inNlsApplyInfoVO.setBdOrderId(orderId);
						// // 查询的网贷申请基本信息
						// NlsApplyInfoVO queryNlsApplyInfoVO =
						// nlsApplyInfoService.queryByPk(inNlsApplyInfoVO);
						// if (Objects.nonNull(queryNlsApplyInfoVO)) {
						// // 网贷用信申请流水号
						// applySeq = queryNlsApplyInfoVO.getApplySeq();
						// } else {
						// String tableName = "nls_apply_info";
						// String errorMsg = "未查询到费率信息关联的网贷申请基本信息，放款订单号：" + orderId + "，借据号：" +
						// bdLoanId;
						// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
						// errorMsg);
						// logger.error(errorMsg);
						// }
						// }
						AccLoanVO queryAccLoanVo = null;
						// 网贷用信申请流水号非空
						// if (!StringUtil.isNullorBank(applySeq)) {
						// 设置借据号
						inAccLoanVO.setBillNo(bdFeeRateTempVO.getLoanId());
						queryAccLoanVo = accLoanService.queryByPk(inAccLoanVO);
						// 1.1根据费率临时信息的借据号查询借据信息是否存在，存在：进行下一步操作，不存在：记录异常信息
						if (Objects.nonNull(queryAccLoanVo)) {
							// 设置新的借据号
							// bdFeeRateTempVO.setLoanId(loanId);
							// int_rate 正常利率 万分之
							bdFeeRateTempVO.setIntRate(DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getIntRate(), oneHundred10000));
							// ovd_rate 罚息利率 万分之
							bdFeeRateTempVO.setOvdRate(DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getOvdRate(), oneHundred10000));
							// fund_fee_ratio 借款服务费率 Number 百分之
							bdFeeRateTempVO.setFundFeeRatio(DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getFundFeeRatio(), oneHundred100));
							// fund_fee_max 借款服务费上限金额 Number 分
							bdFeeRateTempVO.setFundFeeMax(DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getFundFeeMax(), oneHundred100));
							// fund_fee_min 借款服务费下限金额 Number 分
							bdFeeRateTempVO.setFundFeeMin(DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getFundFeeMin(), oneHundred100));
							// charges_rate 分期手续费率 Number 百分之
							bdFeeRateTempVO.setChargesRate(DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getChargesRate(), oneHundred100));
							// overdue_rate 逾期费率 Number 百分之
							bdFeeRateTempVO.setOverdueRate(DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getOverdueRate(), oneHundred100));
							// repay_violate_rate 提前还款违约金费率 Number 百分之
							bdFeeRateTempVO.setRepayViolateRate(
									DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getRepayViolateRate(), oneHundred100));
							// refund_violate_rate 退款违约金费率 Number 百分之
							bdFeeRateTempVO.setRefundViolateRate(
									DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getRefundViolateRate(), oneHundred100));
							// service_rate 担保费费率 Number 百分之
							bdFeeRateTempVO.setServiceRate(DueDataUtil.checkDecimalInfo(bdFeeRateTempVO.getServiceRate(), oneHundred100));
							// cur_date 账务日期 cur_date 账务日期:对账日期（T日）
							bdFeeRateTempVO.setCurDate(DueDataUtil.dateInfoTrans(bdFeeRateTempVO.getCurDate()));
							// 需要新增或者更新的
							list.add(bdFeeRateTempVO);
						} else {
							String tableName = "acc_loan";
							String errorMsg = "未查询到费率信息关联的借据信息，借据号：" + bdLoanId;
							addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
							logger.error(errorMsg);
						}
						// }
					}
					// 需要新增或者更新的费率信息
					if (Objects.nonNull(list) && !list.isEmpty()) {
						List<BdFeeRateVO> bdFeeRatelList = new ArrayList<BdFeeRateVO>();
						bdFeeRatelList = (List<BdFeeRateVO>) beansCopy(list, BdFeeRateVO.class);
						int updateSize = bdFeeRateService.insertOrUpdateBdFeeRate(bdFeeRatelList);
						num += updateSize;
					}
				}
				pageInfo.setPage(++page);
			}
			String num_msg = "【费率表】插入或更新数据处理结果:" + num;
			logger.info(num_msg, "message{}");
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "bd_fee_rate";
			String errorMsg = "同步百度费率临时数据到费率表出错";
			String remark = "同步百度费率临时数据到费率表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步百度费率临时数据到费率表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
		logger.info("同步百度费率临时数据到费率表，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 根据费率临时信息的借据号查询费率正式表信息是否存在 <br>
	 * 0.1:ludayong:2019年3月8日 上午9:03:27:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午9:03:27
	 * @date 2019年3月8日 上午9:03:27
	 * @version 0.1
	 */
	public boolean queryBdFeeRateInfo(BdFeeRateTempVO bdFeeRateTempVO) {
		boolean isExit = false;
		BdFeeRateVO inBdFeeRateVo = new BdFeeRateVO();
		if (Objects.nonNull(bdFeeRateTempVO)) {
			inBdFeeRateVo.setLoanId(bdFeeRateTempVO.getLoanId());
			// 查询费率正式表信息是否存在
			BdFeeRateVO queryBdFeeRateVO = bdFeeRateService.queryByPk(inBdFeeRateVo);
			if (Objects.nonNull(queryBdFeeRateVO)) {
				isExit = true;
			}
		}
		return isExit;
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午8:40:46:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午8:40:46
	 * @date 2019年3月8日 上午8:40:46
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
